/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Reportes.DAO;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pe.edu.pucp.Modelo.Aeropuerto;
import pe.edu.pucp.Modelo.Ciudad;
import pe.edu.pucp.Modelo.Continente;
import pe.edu.pucp.Modelo.Pais;
import pe.edu.pucp.Util.Constante;
import pe.edu.pucp.Util.HibernateUtil;
import pe.edu.pucp.Util.Reportclass.RepViajes;

/**
 *
 * @author jorge
 */
public class ReporteEnviosDAO {
    
    public ArrayList<Continente> listarContinente(){
        ArrayList<Continente> listaContinente = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
                    
        String q = "select ct from Continente ct order by ct.idcontinente";  
        
        Query query = session.createQuery(q);    
        List lista = query.list();
        Iterator iter = lista.iterator(); 
        while (iter.hasNext()) {    
            Continente a = (Continente) iter.next();
            listaContinente.add(a);
        }
        
        tx.commit();
        session.close();

        return listaContinente;
    }      
            
   
    public ArrayList<Pais> listarPais(int idcont){
        ArrayList<Pais> listaPais = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        String q = "select p from Pais p where p.continente.idcontinente = :id order by p.idpais";       
        
        Query query = session.createQuery(q);       
        query.setInteger("id", idcont);
        List lista = query.list();
        Iterator iter = lista.iterator();        
        while (iter.hasNext()) {    
            Pais a = (Pais) iter.next();
            Hibernate.initialize(a.getContinente());
            listaPais.add(a);
        }
        
        tx.commit();
        session.close();

        return listaPais;
    }       
    
    public ArrayList<Ciudad> listarCiudad(int idpa){
        ArrayList<Ciudad> listaCiudad = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();

         String q = "select c from Ciudad c where c.pais.idpais = :id order by c.idciudad";        
        
        Query query = session.createQuery(q);          
        query.setInteger("id", idpa);
        List lista = query.list();        
        Iterator iter = lista.iterator(); 
        while (iter.hasNext()) {    
            Ciudad a = (Ciudad) iter.next();
            Hibernate.initialize(a.getPais());
            Hibernate.initialize(a.getPais().getContinente());
            listaCiudad.add(a);
        }
        
        tx.commit();
        session.close();

        return listaCiudad;
    }    
    
    public ArrayList<Aeropuerto> listarAeropuerto(int idciu){
        ArrayList<Aeropuerto> listaAeropuerto = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        String q = "select a from Aeropuerto a where a.ciudad.idciudad = :id order by a.idaeropuerto";
        
        Query query = session.createQuery(q);        
        query.setInteger("id", idciu);
        List lista = query.list();        
        Iterator iter = lista.iterator(); 
        while (iter.hasNext()) {    
            Aeropuerto a = (Aeropuerto) iter.next();
            Hibernate.initialize(a.getCiudad());
            Hibernate.initialize(a.getCiudad().getPais());
            Hibernate.initialize(a.getCiudad().getPais().getContinente());
            listaAeropuerto.add(a);
        }
        
        tx.commit();
        session.close();

        return listaAeropuerto;
    }
    
    public ArrayList<RepViajes> listarViajes(int conto, int paiso, int ciudo, int contd, int paisd, int ciudd, Date inicio, Date fin){     
        ArrayList<RepViajes> listaKardex = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();        
              
        String q = "select ao.descripcion as origen, ad.descripcion as destino, "
            + "cast (count (*) as int) as cant, cast(sum(v.numpack) as int) as sum "
            + "from vuelo v, aeropuerto ao, aeropuerto ad, ciudad co, ciudad cd, "
            + "pais po, pais pd, continente cto, continente ctd "
            + "where ao.idaeropuerto = v.idorigen and ad.idaeropuerto = v.iddestino "
            + "and ao.idciudad = co.idciudad and ad.idciudad = cd.idciudad "
            + "and co.idpais = po.idpais and cd.idpais = pd.idpais "
            + "and po.idcontinente = cto.idcontinente and pd.idcontinente = ctd.idcontinente "
            + "and v.idestado = :estinac ";
        if (conto>0){ q+="and cto.idcontinente = :conto "; }
        if (paiso>0){ q+="and po.idpais = :paiso "; }
        if (ciudo>0){ q+="and co.idciudad = :ciudo "; }
        if (contd>0){ q+="and ctd.idcontinente = :contd "; }
        if (paisd>0){ q+="and pd.idpais = :paisd "; }
        if (ciudd>0){ q+="and cd.idciudad = :ciudd "; }
        if (inicio!=null){ q+="and cast(v.llegadaest as date) >= cast(:dini as date) "; }
        if (fin!=null){ q+="and cast(v.llegadaest as date) <= cast(:dfin as date) "; }          
        q+= "group by ao.descripcion, ad.descripcion";        
        
        Query query = session.createSQLQuery(q);       
        query.setInteger("estinac", Constante.ESTADO_VUELO_INACTIVO);
        if (conto>0){ query.setInteger("conto", conto); }                
        if (paiso>0){ query.setInteger("paiso", paiso); }
        if (ciudo>0){ query.setInteger("ciudo", ciudo); }
        if (contd>0){ query.setInteger("contd", contd); }                
        if (paisd>0){ query.setInteger("paisd", paisd); }
        if (ciudd>0){ query.setInteger("ciudd", ciudd); }     
        if (inicio!=null){ query.setDate("dini", inicio); }
        if (fin!=null){ query.setDate("dfin", fin); }                  
        List lista = query.list();        

        Iterator iter = lista.iterator(); 
        while (iter.hasNext()) {    
            Object[] row = (Object[]) iter.next();            
            if (row!=null){
                RepViajes rep = new RepViajes((String)row[0],(String)row[1],(int)row[2],(int)row[3]);              
                listaKardex.add(rep);
            }

        }

        tx.commit();
        session.close();
        
        return listaKardex;
    }      
  
    public ArrayList<RepViajes> listarViajes(){     
        ArrayList<RepViajes> listaKardex = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();        
              
        String q = "select ao.descripcion as origen, ad.descripcion as destino, "
            + "cast(count(*) as int) as cant, cast(sum(v.numpack) as int) as sum "
            + "from vuelo v, aeropuerto ao, aeropuerto ad, ciudad co, ciudad cd, "
            + "pais po, pais pd, continente cto, continente ctd "
            + "where ao.idaeropuerto = v.idorigen and ad.idaeropuerto = v.iddestino "
            + "and ao.idciudad = co.idciudad and ad.idciudad = cd.idciudad "
            + "and co.idpais = po.idpais and cd.idpais = pd.idpais "
            + "and po.idcontinente = cto.idcontinente and pd.idcontinente = ctd.idcontinente "
            + "and v.idestado = :estinac and v.numpack > 0"
            + "group by ao.descripcion, ad.descripcion";        
        
        Query query = session.createSQLQuery(q);    
        query.setInteger("estinac", Constante.ESTADO_VUELO_INACTIVO);
        List lista = query.list();        

        Iterator iter = lista.iterator(); 
        while (iter.hasNext()) {    
            Object[] row = (Object[]) iter.next();            
            if (row!=null){
                System.out.println("vuelos:"+(int)row[2]);
                System.out.println("paquetes:"+(int)row[3]);
                RepViajes rep = new RepViajes((String)row[0],(String)row[1],(int)row[2],(int)row[3]);              
                listaKardex.add(rep);
            }

        }

        tx.commit();
        session.close();
        
        return listaKardex;
    }     
    
}
